package com.dferreira.axil.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

import org.hibernate.validator.constraints.NotEmpty;

@SuppressWarnings("serial")
@Entity
@XmlRootElement
public class Produto implements Serializable {

    @Id
    @GeneratedValue
    private Long id;

    @NotNull
    @NotEmpty
    @Size(min = 1, max = 50)
    private String nome;

    @Size(max = 20)
    private String codigo;
    
    @ManyToOne(cascade = CascadeType.ALL)
    private Categoria categoria;
    
    @Digits(fraction = 2, integer = 6)
    private Double valorDeVenda;
    
    @Digits(fraction = 2, integer = 6)
    private Double valorDeCusto;
    
    @Digits(fraction = 2, integer = 6)
    private Double estoqueDisponivel;
    
    @Size(max = 14)
    @Pattern(regexp = "[^a-zA-Z]*", message = "CNPJ deve conter apenas números")
    private String codigoDeBarras;
    
    @Enumerated(EnumType.STRING)
    private UnidadeDeMedida unidadeDeMedida;
    
    @ManyToOne(cascade = CascadeType.ALL)
    private NCM ncm;
    
    @Digits(fraction = 3, integer = 10)
    private Double pesoLiquido;
    
    @Digits(fraction = 3, integer = 10)
    private Double pesoBruto;
	
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataDeCadastro;

	@OneToOne(cascade = CascadeType.ALL)
	private Fornecedor fornecedor;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public Categoria getCategoria() {
		return categoria;
	}

	public void setCategoria(Categoria categoria) {
		this.categoria = categoria;
	}

	public Double getValorDeVenda() {
		return valorDeVenda;
	}

	public void setValorDeVenda(Double valorDeVenda) {
		this.valorDeVenda = valorDeVenda;
	}

	public Double getValorDeCusto() {
		return valorDeCusto;
	}

	public void setValorDeCusto(Double valorDeCusto) {
		this.valorDeCusto = valorDeCusto;
	}

	public Double getEstoqueDisponivel() {
		return estoqueDisponivel;
	}

	public void setEstoqueDisponivel(Double estoqueDisponivel) {
		this.estoqueDisponivel = estoqueDisponivel;
	}

	public String getCodigoDeBarras() {
		return codigoDeBarras;
	}

	public void setCodigoDeBarras(String codigoDeBarras) {
		this.codigoDeBarras = codigoDeBarras;
	}

	public UnidadeDeMedida getUnidadeDeMedida() {
		return unidadeDeMedida;
	}

	public void setUnidadeDeMedida(UnidadeDeMedida unidadeDeMedida) {
		this.unidadeDeMedida = unidadeDeMedida;
	}

	public NCM getNcm() {
		return ncm;
	}

	public void setNcm(NCM ncm) {
		this.ncm = ncm;
	}

	public Double getPesoLiquido() {
		return pesoLiquido;
	}

	public void setPesoLiquido(Double pesoLiquido) {
		this.pesoLiquido = pesoLiquido;
	}

	public Double getPesoBruto() {
		return pesoBruto;
	}

	public void setPesoBruto(Double pesoBruto) {
		this.pesoBruto = pesoBruto;
	}

	public Date getDataDeCadastro() {
		return dataDeCadastro;
	}

	public void setDataDeCadastro(Date dataDeCadastro) {
		this.dataDeCadastro = dataDeCadastro;
	}

	public Fornecedor getFornecedor() {
		return fornecedor;
	}

	public void setFornecedor(Fornecedor fornecedor) {
		this.fornecedor = fornecedor;
	}

}
